home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 18 / CU Amiga Magazine's Super CD-ROM 18 (1997)(EMAP Images)(GB)[!][issue 1998-01].iso / CUCD / Programming / AmigaE / Src / OOmodules / sort / numbers / fraction.e < prev    next >
Encoding:
Text File  |  1995-05-20  |  5.1 KB  |  243 lines

  1. /*
  2.  
  3. Things which are marked with 'CHANGE' should be changed
  4.  
  5.  
  6. NOTE: this object is basically based on integer, so why not inherit from it?
  7.       In other words, it inherits technically, but not logically. So don't
  8.       let it inherit from integer but from number?
  9.  
  10.       - make it possible for add(), multiply() etc. to take 'Integer' as
  11.         argument, too?
  12. */
  13.  
  14. OPT MODULE
  15. OPT EXPORT
  16.  
  17. MODULE 'oomodules/sort/numbers', 'oomodules/sort/numbers/integer'
  18.  
  19.  
  20. OBJECT fraction OF number
  21.   upper:PTR TO integer
  22.   lower:PTR TO integer
  23. ENDOBJECT
  24.  
  25. PROC name() OF fraction IS 'Fraction'
  26.  
  27. PROC init() OF fraction
  28. DEF up:PTR TO integer,lo:PTR TO integer
  29.  
  30.   NEW up.new()
  31.   self.upper:=up
  32.   NEW lo.new()
  33.   self.lower:=lo
  34. ENDPROC
  35.  
  36. PROC getUpper() OF fraction IS self.upper.get()
  37. PROC getLower() OF fraction IS self.lower.get()
  38.  
  39. PROC setUpper(value) OF fraction IS self.upper.set(value)
  40. PROC setLower(value) OF fraction IS self.lower.set(value)
  41.  
  42. /*
  43.  * negate the fraction just by nagating the Upper
  44.  */
  45. PROC negate() OF fraction
  46.   self.upper.negate()
  47. ENDPROC
  48.  
  49. PROC add(what:PTR TO fraction) OF fraction
  50. DEF resultingUpper:PTR TO integer,
  51.     resultingLower:PTR TO integer,
  52.     result_a,result_b
  53.  
  54.   NEW resultingUpper.new()
  55.   NEW resultingLower.new()
  56.  
  57.   IF self.lower.cmp(what.lower)=0    -> nenner sind gleich
  58.     self.setUpper(self.getUpper() + what.getUpper()) -> CHANGE when integer.add() exists
  59.   ELSE -> nenner sind unterschiedlich
  60.     resultingUpper.set( (self.getUpper() * what.getLower()) + (self.getLower() * what.getUpper()))  -> zähler1 * nenner2 + nenner1 * zähler2
  61.     resultingLower.set( self.getLower() * what.getLower())  -> nenner1 * nenner2
  62.  
  63.     /* kürzen fehlt noch */
  64.  
  65.     self.upper.set( resultingUpper.get() )
  66.     self.lower.set( resultingLower.get() )
  67.  
  68.   ENDIF
  69.  
  70.   END resultingUpper
  71.   END resultingLower
  72.  
  73. ENDPROC
  74.  
  75. PROC substract(what:PTR TO fraction) OF fraction
  76. /*
  77.  
  78. pure lazyness:
  79.  
  80. just negate the argument, then add it...
  81. */
  82.   what.negate()
  83.   self.add(what)
  84.   what.negate()
  85. ENDPROC
  86.  
  87. PROC multiply(what:PTR TO fraction) OF fraction
  88. DEF resultingUpper:PTR TO integer,
  89.     resultingLower:PTR TO integer
  90.  
  91.   NEW resultingUpper.new()
  92.   NEW resultingLower.new()
  93.  
  94.   resultingUpper.set( self.getUpper() * what.getUpper() ) /* CHANGE integer.mul */
  95.   resultingLower.set( self.getLower() * what.getLower() ) /* dto. */
  96.  
  97.   /* kürzen fehlt */
  98.  
  99.   self.upper.set( resultingUpper.get() )
  100.   self.lower.set( resultingLower.get() )
  101.  
  102.   END resultingUpper
  103.   END resultingLower
  104.  
  105. ENDPROC
  106.  
  107. PROC divide(bywhat:PTR TO fraction) OF fraction
  108. DEF swapper:PTR TO integer
  109.  
  110.   NEW swapper.new() -> we need something to store
  111.  
  112.   swapper.set( bywhat.getUpper() ) -> store upper
  113.  
  114.   bywhat.setUpper( bywhat.getLower() ) -> set upper
  115.   bywhat.setLower( swapper.get() ) -> set lower
  116.  
  117.   self.multiply( bywhat ) -> multiply
  118.  
  119.   -> now swap back
  120.  
  121.   bywhat.setLower( bywhat.getUpper() )
  122.   bywhat.setUpper( swapper.get() )
  123.  
  124.   END swapper
  125. ENDPROC
  126.  
  127. PROC write() OF fraction
  128. DEF out
  129.  
  130.   out := String(30) -> think that's enough
  131.  
  132.   StringF(out, '\d/\d', self.getUpper(), self.getLower())
  133. ENDPROC out
  134.  
  135. PROC end() OF fraction
  136. DEF integer:PTR TO integer
  137.  
  138.   integer := self.upper
  139.   END integer
  140.  
  141.   integer := self.lower
  142.   END integer
  143.  
  144. ENDPROC
  145.  
  146. PROC select(optionlist,index) OF fraction
  147. /*
  148.  
  149.   With select up to now two arguments are taken:
  150.  
  151.   "copy" - takes a fraction as argument and gets its values. Take it as  a
  152.            simple copy.
  153.   "set"  - takes two numbers and uses them as Upper, Lower
  154. */
  155. DEF item, fraction:PTR TO fraction
  156.  
  157.   item := ListItem(optionlist, index)
  158.  
  159.   SELECT item
  160.     CASE "copy"
  161.       INC index
  162.       fraction := ListItem(optionlist,index) -> typed list
  163.  
  164.       self.setUpper( fraction.getUpper() )
  165.       self.setLower( fraction.getLower() )
  166.     CASE "set"
  167.       INC index
  168.       item := ListItem(optionlist,index)
  169.       self.setUpper( item )
  170.       INC index
  171.       item := ListItem(optionlist,index)
  172.       self.setLower( item )
  173.   ENDSELECT
  174.  
  175. ENDPROC index
  176.  
  177. -> just copies its attributes
  178. PROC copy(to:PTR TO fraction) OF fraction
  179.   to.setUpper( self.getUpper() )
  180.   to.setLower( self.getLower() )
  181. ENDPROC
  182.  
  183. PROC flt2fraction(flt) OF fraction
  184. /*
  185.  
  186. This method sets its objects attributes to the values found in
  187. the float.
  188.  
  189. */
  190. DEF index,lower=-1, gefunden=0, fltindex,
  191.     result, out[80]:STRING,
  192.     fltupper,upper, fltlower
  193.  
  194.   FOR index := 1 TO 1000
  195.     fltindex := index! -> richtig
  196.     result := !flt * fltindex  ->richtig
  197.  
  198.     ->RealF(out,result,5); WriteF('::\s\n',out)
  199.  
  200.     result := !Fceil(result)-result
  201.  
  202.     result := result < 0.0001
  203.  
  204.     IF result THEN gefunden := 1
  205.     IF gefunden=1
  206.       lower:= index
  207.       index:=1000
  208.     ENDIF
  209.   ENDFOR
  210.  
  211.   IF lower=-1 THEN lower:=1000
  212. -> the lower is found
  213.  
  214.   fltlower := lower!
  215.   fltupper := !flt * fltlower
  216.   upper := !fltupper!
  217.  
  218.   self.setUpper(upper)
  219.   IF upper=0
  220.     self.setLower(1)
  221.   ELSE
  222.     self.setLower(lower)
  223.   ENDIF
  224. ENDPROC
  225.  
  226. PROC fraction2flt() OF fraction -> move to Float
  227. DEF flt,upper,lower,kleiner=0
  228.  
  229.   IF (upper := self.getUpper())<0
  230.     upper:=upper*(-1)
  231.     INC kleiner
  232.   ENDIF
  233.   IF (lower := self.getLower())<0
  234.     lower:=lower*(-1)
  235.     INC kleiner
  236.   ENDIF
  237.  
  238.   flt := ! upper / lower
  239.  
  240.   IF kleiner=1 THEN flt := ! 0 - flt
  241.  
  242. ENDPROC flt
  243.